package main

import (
	"bufio"
	"fmt"
	"io"
	"net"
	"os"
	"strings"
	"time"
)

func main() {
	conn, err := net.Dial("tcp", "127.0.0.1:8008")
	if err != nil {
		fmt.Println("链接失败: ", err)
		return
	}
	defer conn.Close()

	chExit := make(chan int, 1)
	// 从终端获取数据并发送到服务端
	go sendMsFromStdin(conn, chExit)
	go readMsgFromServer(conn)

	//阻塞等待用户输入
	for {
		n, ok := <-chExit
		if n == 1 {
			fmt.Println("用户退出客户端!")
			break
		} else {
			fmt.Printf("main管道 n=%v ok=%v \n", n, ok)
		}
	}

	fmt.Println("client exit")
}
func readMsgFromServer(conn net.Conn) {
	for {
		buf := make([]byte, 1024)
		n, err := conn.Read(buf)
		if err == io.EOF {
			break
		} else if err == nil && len(buf[:n]) > 0 {
			fmt.Printf("接收到服务端的信息: %v\n", string(buf[:n]))
		}

	}
}

// 从终端获取数据并发送到服务端
func sendMsFromStdin(conn net.Conn, ch chan<- int) {
	// 这里使用标准输入作为rd, os.Stdin
	reader := bufio.NewReader(os.Stdin)
	maxErrCnt := 3

	//循环处理
	for {
		// 从终端读取用户的输入并发送给服务器
		line, err := reader.ReadString('\n')
		if err != nil {
			fmt.Printf("获取数据失败, %v", err)
		}
		if strings.HasPrefix(line, "quit") {
			ch <- 1 //写入1 退出循环
			break
		}
		// 读取数据正常,开始发送数据
		len, err := conn.Write([]byte(line))
		if err != nil && maxErrCnt > 0 {
			maxErrCnt--
			fmt.Printf("发送数据错误 %v 等待3秒后重试,还剩 %d次重试机会\n", err, maxErrCnt)
			time.Sleep(3 * time.Second)
		} else if err == nil {
			fmt.Printf("本次发送了 %v 个字节的数据\n", len)
			reader.Reset(os.Stdin) // 每次数据发送后重置reader
		} else if maxErrCnt <= 0 {
			ch <- 1 //写入1 退出循环
			break
		} else {
			fmt.Printf("else len:%v  err:%v \n", len, err)
		}

	}
	fmt.Println("即将关闭ch")
	close(ch) //关闭ch

}
